package br.com.trumah.dao.impl;

import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

import br.com.trumah.dao.interfaces.UsuarioDAO;
import br.com.trumah.model.Beneficiario;
import br.com.trumah.model.Usuario;
import br.com.trumah.utils.HibernateUtil;

public class UsuarioDAOImpl implements UsuarioDAO {

	
	private Session session = null;
	private Transaction t = null;
	
	@Override
	public void salvar(Usuario usuario) {
		
		try {

			session = HibernateUtil.getSessionFactory().openSession();
			t = session.beginTransaction();
			session.save(usuario);
			t.commit();
			
		} catch (HibernateException ex) {
			
			t.rollback();
			ex.printStackTrace();
			
		} finally {
			
			session.close();
			
		}
	}

	@Override
	public Usuario obterUsuario(long id) {
		
		Usuario usuario = null;
		
		try {

			session = HibernateUtil.getSessionFactory().openSession();
			usuario = (Usuario) session.load(Usuario.class, id);
			
		} catch (HibernateException ex) {
			
			ex.printStackTrace();
			
		} finally {
			
			session.close();
			
		}
		
		return usuario;
		
	}

	@SuppressWarnings("unchecked")
	@Override
	public List<Usuario> listar() {
		
		List<Usuario> lista = null;
		
		try {

			session = HibernateUtil.getSessionFactory().openSession();
			t = session.beginTransaction();
			lista = session.createQuery("from Usuario").list();
			t.commit();
			
		} catch (HibernateException ex) {
			
			ex.printStackTrace();
			
		} finally {
			
			session.close();
			
		}
		
		return lista;
	}

	@Override
	public void remover(Usuario usuario) {
		
		try {
			
			session = HibernateUtil.getSessionFactory().openSession();
			t = session.beginTransaction();
			session.delete(usuario);
			t.commit();
			
		} catch (HibernateException ex) {
			
			t.rollback();
			ex.printStackTrace();
			
		} finally {
			
			session.close();
			
		}
		
	}

	@Override
	public void atualizar(Usuario usuario) {
		
		try {

			session = HibernateUtil.getSessionFactory().openSession();
			t = session.beginTransaction();
			session.update(usuario);
			t.commit();
			
		} catch (HibernateException ex) {
			
			t.rollback();
			ex.printStackTrace();
			
		} finally {
			
			session.close();
			
		}

	}

	@Override
	public boolean existe(Usuario usuario) {
		
		session = HibernateUtil.getSessionFactory().openSession();
		t = session.beginTransaction();
		Query query = session.createQuery("from Usuario u where u.login = :pLogin and u.senha = :pSenha");
		query.setParameter("pLogin", usuario.getLogin());
		query.setParameter("pSenha", usuario.getSenha());
		
		boolean usuarioEncontrado = !query.list().isEmpty();
		
		t.commit();
		
		session.close();
		
		return usuarioEncontrado;
	}

}
